home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / mig / RCS / Mig_ConfirmIdle.c,v < prev    next >
Text File  |  1990-09-24  |  8KB  |  344 lines

  1. head     2.3;
  2. branch   ;
  3. access   ;
  4. symbols  no-auto-remigrate:2.1 installed:2.0;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 2.3
  10. date     90.09.24.14.46.46;  author douglis;  state Exp;
  11. branches ;
  12. next     2.2;
  13.  
  14. 2.2
  15. date     90.06.26.18.43.48;  author douglis;  state Exp;
  16. branches ;
  17. next     2.1;
  18.  
  19. 2.1
  20. date     90.06.22.14.58.16;  author douglis;  state Exp;
  21. branches ;
  22. next     2.0;
  23.  
  24. 2.0
  25. date     90.03.10.13.12.34;  author douglis;  state Stable;
  26. branches ;
  27. next     1.2;
  28.  
  29. 1.2
  30. date     90.02.28.10.56.04;  author douglis;  state Exp;
  31. branches ;
  32. next     1.1;
  33.  
  34. 1.1
  35. date     90.02.16.14.27.17;  author douglis;  state Exp;
  36. branches ;
  37. next     ;
  38.  
  39.  
  40. desc
  41. @Confirm that a host is available.
  42. @
  43.  
  44.  
  45. 2.3
  46. log
  47. @added callback flag to MigHostCache to make it easier to flag all hosts as reclaimed after error
  48. @
  49. text
  50. @/* 
  51.  * Mig_ConfirmIdle.c --
  52.  *
  53.  *    Confirm that a host is available.
  54.  *
  55.  * Copyright 1988, 1990 Regents of the University of California
  56.  * Permission to use, copy, modify, and distribute this
  57.  * software and its documentation for any purpose and without
  58.  * fee is hereby granted, provided that the above copyright
  59.  * notice appear in all copies.  The University of California
  60.  * makes no representations about the suitability of this
  61.  * software for any purpose.  It is provided "as is" without
  62.  * express or implied warranty.
  63.  */
  64.  
  65. #ifndef lint
  66. static char rcsid[] = "$Header: /sprite/src/lib/c/mig/RCS/Mig_ConfirmIdle.c,v 2.2 90/06/26 18:43:48 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  67. #endif /* not lint */
  68.  
  69.  
  70. #include <stdio.h>
  71. #include <sprite.h>
  72. #include <status.h>
  73. #include <bit.h>
  74. #include <mig.h>
  75. #include <kernel/net.h>
  76. #include <sys/time.h>
  77. #include <sysStats.h>
  78. #include <host.h>
  79. #include <errno.h>
  80. #include "migInt.h"
  81.  
  82. /* 
  83.  * Keep track of whether we should get new hosts, or whether we know none
  84.  * are available.  Defaults to asking, of course.  Set to 0 if too few
  85.  * hosts are available.
  86.  */
  87. int migGetNewHosts = 1;
  88.  
  89. /*
  90.  *----------------------------------------------------------------------
  91.  *
  92.  * Mig_ConfirmIdle --
  93.  *
  94.  *    Double-check that a host is still accepting migration.  Otherwise
  95.  *    we could keep migrating to a host that is no longer idle.  We check
  96.  *    to see if the stream is selectable, in which case we get
  97.  *    any updates to host availability and modify our cache, and in any
  98.  *    case we then check the host cache.  The same logic is used to
  99.  *    check for msgs indicating a host is now available, in which
  100.  *     case a hostID  of 0 is used.
  101.  *
  102.  * Results:
  103.  *    TRUE if the host is still available (or a new host is available,
  104.  *    if hostID == 0), FALSE otherwise or if an error occurs.
  105.  *
  106.  * Side effects:
  107.  *    May do ioctl to server.
  108.  *
  109.  *----------------------------------------------------------------------
  110.  */
  111. Boolean
  112. Mig_ConfirmIdle(hostID)
  113.     int hostID;            /* ID of host to confirm availability of */
  114. {
  115.     static int *bitArray = NULL;
  116.     static int bitSize = 0;
  117.     int numReady;
  118.     int status;
  119.     int msgHostID;
  120.     struct timeval time;
  121.     int retries = 0;
  122.     
  123. #ifdef DEBUG
  124.     fprintf(stderr, "Mig_ConfirmIdle(%d) called.\n", hostID);
  125. #endif /* DEBUG */
  126.  
  127.     if (mig_GlobalPdev < 0) {
  128. #ifdef DEBUG
  129.     fprintf(stderr, "Mig_ConfirmIdle: no pdev connection.\n");
  130. #endif /* DEBUG */
  131.     return(FALSE);
  132.     }
  133.     if (bitSize <= mig_GlobalPdev) {
  134.     bitArray = Bit_Expand(mig_GlobalPdev + 1, bitSize, bitArray);
  135.     bitSize = mig_GlobalPdev + 1;
  136.     }
  137.         
  138.     while (1) {
  139.     Bit_Set(mig_GlobalPdev, bitArray);
  140.     time.tv_sec = 0;
  141.     time.tv_usec = 0;
  142. #ifdef DEBUG
  143.     fprintf(stderr, "Mig_ConfirmIdle: calling select.\n");
  144. #endif /* DEBUG */
  145.     numReady = select(bitSize, bitArray, (int *) NULL, (int *) NULL,
  146.          &time);
  147. #ifdef DEBUG
  148.     fprintf(stderr, "Mig_ConfirmIdle: select returned %d.\n", numReady);
  149. #endif /* DEBUG */
  150.     if (numReady <= 0) {
  151.         break;
  152.     } else {
  153. #ifdef DEBUG
  154.         fprintf(stderr, "Mig_ConfirmIdle: calling Fs_IOControl.\n");
  155. #endif /* DEBUG */
  156.         if (MigSetAlarm() < 0) {
  157.         fprintf(stderr,
  158.             "Error setting alarm for contact with migd.\n");
  159.         return(FALSE);
  160.         }
  161.         status = Fs_IOControl(mig_GlobalPdev, IOC_MIG_GET_UPDATE,
  162.                   0, (char *) NULL, sizeof(int),
  163.                   (char *) &msgHostID);
  164.         if (MigClearAlarm() < 0) {
  165.         fprintf(stderr,
  166.             "Error clearing alarm for contact with migd.\n");
  167.         }
  168.         
  169.         
  170. #ifdef DEBUG
  171.         fprintf(stderr, "Mig_ConfirmIdle: Fs_IOControl returned %x.\n",
  172.            status);
  173. #endif /* DEBUG */
  174.         if (status != SUCCESS) {
  175.         fprintf(stderr,
  176.                "Mig_ConfirmIdle: error during ioctl to global master: %s\n",
  177.                Stat_GetMsg(status));
  178.         if (status & 0xf0000 || status == GEN_ABORTED_BY_SIGNAL) {
  179.             /*
  180.              * fs/dev/... error, or timeout,
  181.              * rather than FAILURE or INVALID_ARG.
  182.              */
  183.             close(mig_GlobalPdev);
  184.             mig_GlobalPdev = 0;
  185.             if (retries > 0 || MigOpenPdev(TRUE) < 0) {
  186.             return(FALSE);
  187.             }
  188.             retries = 1;
  189.         } else {
  190.             return(FALSE);
  191.         }
  192.         continue;
  193.         }
  194.         if (msgHostID == 0) {
  195. #ifdef DEBUG
  196.         fprintf(stderr, "Mig_ConfirmIdle: new host(s) available.\n");
  197. #endif /* DEBUG */
  198.         migGetNewHosts = 1;
  199.         if (migCallBackPtr != NULL) {
  200.             (*migCallBackPtr)(msgHostID);
  201.         }
  202.         } else 
  203. #ifdef DEBUG
  204.         fprintf(stderr, "Mig_ConfirmIdle: host %d unavailable.\n",
  205.                msgHostID);
  206. #endif /* DEBUG */
  207.         (void) MigHostCache(msgHostID, MIG_CACHE_REMOVE, TRUE);
  208.     }
  209.     }
  210.     if (hostID == 0) {
  211. #ifdef DEBUG
  212.     fprintf(stderr, "Mig_ConfirmIdle: returning %d.\n", migGetNewHosts);
  213. #endif /* DEBUG */
  214.     return(migGetNewHosts);
  215.     }
  216. #ifdef DEBUG
  217.     fprintf(stderr, "Mig_ConfirmIdle: returning %d.\n",
  218.        MigHostCache(hostID, MIG_CACHE_VERIFY, FALSE));
  219. #endif /* DEBUG */
  220.     return(MigHostCache(hostID, MIG_CACHE_VERIFY, FALSE));
  221. }
  222. @
  223.  
  224.  
  225. 2.2
  226. log
  227. @call back on evictions too, and pass hostID.
  228. @
  229. text
  230. @d17 1
  231. a17 1
  232. static char rcsid[] = "$Header: /sprite/src/lib/c/mig/RCS/Mig_ConfirmIdle.c,v 2.1 90/06/22 14:58:16 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  233. d150 3
  234. d158 1
  235. a158 4
  236.         (void) MigHostCache(msgHostID, MIG_CACHE_REMOVE);
  237.     }
  238.     if (migCallBackPtr != NULL) {
  239.         (*migCallBackPtr)(msgHostID);
  240. d169 1
  241. a169 1
  242.        MigHostCache(hostID, MIG_CACHE_VERIFY));
  243. d171 1
  244. a171 1
  245.     return(MigHostCache(hostID, MIG_CACHE_VERIFY));
  246. @
  247.  
  248.  
  249. 2.1
  250. log
  251. @changes for alarms for timeouts with migd and for printing to stderr instead of syslog
  252. @
  253. text
  254. @d17 1
  255. a17 1
  256. static char rcsid[] = "$Header: /sprite/src/lib/c/mig/RCS/Mig_ConfirmIdle.c,v 2.0 90/03/10 13:12:34 douglis Stable Locker: douglis $ SPRITE (Berkeley)";
  257. a149 3
  258.         if (migCallBackPtr != NULL) {
  259.             (*migCallBackPtr)();
  260.         }
  261. d156 3
  262. @
  263.  
  264.  
  265. 2.0
  266. log
  267. @Changing version numbers.
  268. @
  269. text
  270. @d17 1
  271. a17 1
  272. static char rcsid[] = "$Header: /sprite/src/lib/c/mig/RCS/Mig_ConfirmIdle.c,v 1.2 90/02/28 10:56:04 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  273. d23 1
  274. a27 1
  275. #include <syslog.h>
  276. d75 1
  277. a75 1
  278.     syslog(LOG_INFO, "Mig_ConfirmIdle(%d) called.\n", hostID);
  279. d80 1
  280. a80 1
  281.     syslog(LOG_INFO, "Mig_ConfirmIdle: no pdev connection.\n");
  282. d94 1
  283. a94 1
  284.     syslog(LOG_INFO, "Mig_ConfirmIdle: calling select.\n");
  285. d99 1
  286. a99 1
  287.     syslog(LOG_INFO, "Mig_ConfirmIdle: select returned %d.\n", numReady);
  288. d105 1
  289. a105 1
  290.         syslog(LOG_INFO, "Mig_ConfirmIdle: calling Fs_IOControl.\n");
  291. d107 5
  292. d115 6
  293. d122 1
  294. a122 1
  295.         syslog(LOG_INFO, "Mig_ConfirmIdle: Fs_IOControl returned %x.\n",
  296. d126 1
  297. a126 1
  298.         syslog(LOG_WARNING,
  299. d129 1
  300. a129 1
  301.         if (status & 0xf0000) {
  302. d131 2
  303. a132 1
  304.              * fs/dev/... error rather than FAILURE or INVALID_ARG.
  305. d147 1
  306. a147 1
  307.         syslog(LOG_INFO, "Mig_ConfirmIdle: new host(s) available.\n");
  308. d155 1
  309. a155 1
  310.         syslog(LOG_INFO, "Mig_ConfirmIdle: host %d unavailable.\n",
  311. d163 1
  312. a163 1
  313.     syslog(LOG_INFO, "Mig_ConfirmIdle: returning %d.\n", migGetNewHosts);
  314. d168 1
  315. a168 1
  316.     syslog(LOG_INFO, "Mig_ConfirmIdle: returning %d.\n",
  317. @
  318.  
  319.  
  320. 1.2
  321. log
  322. @added migCallBackPtr use.  changed Mig_OpenPdev to internal Mig routine.
  323. @
  324. text
  325. @d17 1
  326. a17 1
  327. static char rcsid[] = "$Header: /sprite/src/lib/c/mig/RCS/Mig_ConfirmIdle.c,v 1.1 90/02/16 14:27:17 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  328. @
  329.  
  330.  
  331. 1.1
  332. log
  333. @Initial revision
  334. @
  335. text
  336. @d17 1
  337. a17 1
  338. static char rcsid[] = "$Header: /user2/douglis/pdev_mig/mig_p/RCS/Mig_ConfirmIdle.c,v 1.2 90/02/13 10:07:20 douglis Exp Locker: douglis $ SPRITE (Berkeley)";
  339. d124 1
  340. a124 1
  341.             if (retries > 0 || Mig_OpenPdev(TRUE) < 0) {
  342. d138 3
  343. @
  344.